﻿#pragma execution_character_set("utf-8")
/***************************************************************************
 创建者: 华磊
 开始时间: 2020.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2020.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef FILEDATA_H
#define FILEDATA_H

#include <QStringList>
#include <QTextStream>
#include <QCryptographicHash>
#include <QRegExp>
#include <QMutex>
#include "xmlparse.h"
#include "instructionstruct.h"
#include "globalDefine.h"
#include "communicatedelegate_global.h"

class CommunicateNormalDelegate;
class GlobalData;
class ProgramTextTransfer;


//#ifdef HMICOMMUNICATE_LIBRARY
//#include "hmicommunicate_global.h"
//        class HMICOMMUNICATESHARED_EXPORT FileData : public QObject//无法加锁 原因不明
//#else
class  FileData : public QObject//无法加锁 原因不明
//#endif
{
    Q_OBJECT
public:
    FileData();
    ~FileData();
public:
    int getCurrentFileName(QString &fileNameOut);
    int readProgram(QString strFilePath);//???是否正确　ｈｕａｌｅｉ
    /**
     * @brief writeProgramFile  将程序文件写入文件
     * @param strFilePath       路径
     * @param fileExist         文件是否存在的标志
     */
    int writeProgramFile(QString strFilePath,bool fileExist);
    /**
     * @brief readProgramQuick  只读取属性部分:赋值给fileProInfoQuick(文件预览用)
     * @param strFilePath
     * @return
     */
    int readProgramQuick(QString strFilePath);

    /**
     * @brief readProgramToCode 返回代码部分 run显示需要
     * @param strFilePath
     * @param codeList
     * @return
     */
    int readProgramToCode(QString strFilePath,QStringList &codeList);
    int readProgramToCode_byLocalFile(QString strFilePath,QStringList &codeList);
    int readProgramToCode_byGsoap(QString strFileName, QStringList &codeList);


    /**
     * @brief readProgramToMD5          获取程序md5
     */
    QString readProgramToMD5(QString strFilePath);
    /**
     * @brief readFileToMD5             获取文件md5
     */
    QString readFileToMD5(QString strFilePath);

    //MD5 获取 与检查
    QString getMD5(QString wholePath);
    bool checkMD5(QString checkMD5, QString wholePath);

signals:
    void msgBoxSignal(int type,QString title,QString text);

private://旧的作废，不再使用
//    int readProgram_oldLong(QString strFilePath);//后面作废
//    void writeProgramFile_oldLong(QString strFilePath,bool fileExist);//需要拆分成小函数
//    QStringList translateCmdList(int language , QStringList cmd);//作废
//    int readProgramAttribute(QVector <QString> fileInfoList, QString strFilePath);
//    int readProgramPalletInfo(QVector <QString> fileInfoList);
//    int readProgramArmPointInfo(QVector <QString> fileInfoList);
//    int readProgramCommandList(QVector <QString> fileInfoList);
//    int writeProgramAttribute();
//    int writeProgramPalletInfo();
//    int writeProgramArmPointInfo();
//    int writeProgramCommandList();
//    void writeProgramDPointData(QVector<QString> &programStrList);
//    void readProgramDPointData(QVector <QString> fileInfoList, QMap<int, DPoint> &vehicleDPointListOut);

public:

    /**
     * @brief GsoapFileWriteFlag        gsoap文件写入标识
     */
    bool isGsoapFileWriteFlag;

    /**
     * @brief xmlParse              xml操作初始化
     */
    XmlParse xmlParse;
    /**
     * @brief md5Map                xml:所有文件的md5数据
     */
    QMap <int,QMap <QString,QString> > md5Map;
    /**
     * @brief ioMsgData             xml:所有IO的注释
     */
    QVector <QVector <QString> > ioMsgData;

    /**
     * @brief initFileData          FileData初始化
     */
    void initFileData();

    /**
     * @brief axisUnit              轴单位 写文件用缓存
     */
    QVector<int> axisUnit;

    /**
     * @brief currentRobotFileAddress   获取来自机器人消息的地址
     */
    QString currentRobotFileAddress;

    //from serverControl
    /**
     * @brief currentProgramName    当前程序的名字
     */
    QString currentProgramName;
    /**
     * @brief currentFile           当前打开文件　包括路径和文件名
     */
    QString currentFile;
    /**
     * @brief currentFileName       当前打开文件　文件名
     */
    QString currentFileName;
    /**
     * @brief cmdStrList            命令指令
     */
    //QVector <QString> cmdStrList;
    QStringList cmdStrList;
    /**
     * @brief cmdStrWriteList   编辑后 命令指令(写入操作用):此处原本为控制器接收后的指令长度(即要保存的缓存长度)
     */
    QStringList cmdStrWriteList;
    /**
     * @brief cmdStrWriteSuccess    写文件成功标志
     */
    bool cmdStrWriteSuccess;

    /**
     * @brief rendQuickSuccess      快读文件属性
     */
    bool rendQuickSuccess;

    /**
     * @brief fileProInfo       文件属性,readAtrribute
     */
    FileInfo  fileProInfo;
    /**
     * @brief fileProInfoQuick  临时读取文件信息 (预览用)
     */
    FileInfo  fileProInfoQuick;
    /**
     * @brief getPointProList   保存普通点到pointData组件的操作
     */
    QVector <PointPro> getPointProList;

    QMap <int, DPoint> vehicleDPointList; //agv用

    /**
     * @brief palletStackInfo   保存码垛点到pointData组件的操作
     */
    QVector <StackInfo> palletStackInfo;
    /**
     * @brief regPlList         对接RegData组件的pl寄存器接口
     */
    QVector <PlRegStruct> regPlList;

    /**
     * @brief programList       写操作时候:文件内容每一行的缓存,然后写入
     */
    QVector <QString> programList;

    int programFileVersion;//程序版本

    /**
     * @brief saveAxisUnit      轴单位保存LV1时候获取
     */
    QVector <int > saveAxisUnit;//多线程coredump风险
    QVector <int > saveExtAxisUnit;

    /**
     * @brief normalPointLock   点锁定 操作(每次打开文件都需要清空该 缓存)
     */
    QVector <bool > normalPointLock;

    //写操作用
    int globalDefaultUserNum;
    int globalDefaultToolNum;

    /**
     * @brief writeAllowFLag    是否允许写操作
     */
    bool writeAllowFLag;

    /**
     * @brief readAllowFlag     是否允许读操作
     */
    bool readAllowFlag;

    /**
     * @brief fileOpenFirst     文件是否刚打开(如果是刚打开的,就不会做 是否修改的判断)
     */
    //bool fileOpenFirst;

    /**
     * @brief tabSetFileIndex   当前选中的文件(renView的Tab标签的index,默认0)
     */


    int ftpOperateNum;

    /**
     * @brief communicateNormalDelegate       gsoap通信类
     */
    CommunicateNormalDelegate *communicateNormalDelegate;

    /**
     * @brief globalData                    全局数据
     */
    GlobalData *globalData;

public:
    QVector<HmiToolCoordinateInformation> toolInfo;
    QVector<HmiUserCoordinateInformation> userInfo;

private:
    /**
     * @brief mutex         保证数据安全同步锁
     */
    QMutex mutex;
    ProgramTextTransfer* textTransfer;
};

#endif // FILEDATA_H
